#pragma once

typedef int MSGID;

class CProjectile;
class CEnemy;
class CBoss;
class CUnit;
enum eMsgTypes { MSG_NULL = 0, MSG_CREATE_ENEMY, MSG_CREATE_PROJECTILE, MSG_CREATE_BOSS, MSG_CREATE_UNIT,
				MSG_DESTROY_ENEMY, MSG_DESTROY_PROJECTILE,  MSG_DESTROY_BOSS, MSG_DESTROY_UNIT, MSG_DESTROY_ALL, MSG_MAX };

class CBaseMessage
{
private:
	MSGID	m_msgID;

public:
	CBaseMessage(MSGID msgID);

	virtual ~CBaseMessage(void) {}

	MSGID GetMsgID(void)	{ return m_msgID; }
};

//Creates
class CCreateEnemyMessage : public CBaseMessage
{
public:
	CCreateEnemyMessage() : CBaseMessage(MSG_CREATE_ENEMY) {}
};

class CCreateProjectiletMessage : public CBaseMessage
{

public:
	CCreateProjectiletMessage() : CBaseMessage(MSG_CREATE_PROJECTILE) {}

};
class CCreateBossMessage : public CBaseMessage
{
public:
	CCreateBossMessage() : CBaseMessage(MSG_CREATE_BOSS) {}
};

class CCreateUnitMessage : public CBaseMessage
{
public:
	CCreateUnitMessage() : CBaseMessage(MSG_CREATE_UNIT) {}
};


// Destroys
class CDestroyEnemyMessage : public CBaseMessage
{
private: 
	CEnemy* m_pEnemy;

public:
	CDestroyEnemyMessage(CEnemy *m_pEnemy);
	~CDestroyEnemyMessage();
	CEnemy* GetEnemy() { return m_pEnemy;}

};

class CDestroyProjectileMessage : public CBaseMessage
{
public:
	CDestroyProjectileMessage() :  CBaseMessage( MSG_DESTROY_PROJECTILE) {}

};


class CDestroyBossMessage : public CBaseMessage
{
public:
	CDestroyBossMessage() : CBaseMessage(MSG_DESTROY_BOSS) {}

};
class DestroyUnitMessage : public CBaseMessage
{
public:
	DestroyUnitMessage() : CBaseMessage(MSG_DESTROY_UNIT) {}
};
class DestroyAllEnemies : public CBaseMessage
{
public:
	DestroyAllEnemies() : CBaseMessage(MSG_DESTROY_ALL) {}
};
